

let Command = require('./command');
let AddSelCommand = require('./addSelCmd');

// 添加Chain
class AddChainCommand extends Command{
    constructor(){
        super();

        this.name = 'Add Chain Node';
        this.type = 'AddChain';

        // 新添加的chain
        this._lstAffect = [];

        this._addselCmd = null;
    }

    execute(){
        let mapScene = G.gameApp;

        // 分两步:
        // 1. 判断是否需要创建 一个新的chain
        // 2. 添加一个 sel
        let newChain;
        if(mapScene.curChain.lstSel.length >= 1){
            newChain = mapScene._createChain();
        }

        this.setObj('newChain',newChain);

        // 更新后面依赖的 chain
        // 不管是否创建 chain, 都会添加一个 sel node,后面的命令可能会依赖这个selnode
        if(newChain){
            this.setAffectLst(this._lstAffect,newChain);
            mapScene.setCurChain(newChain);
        }

        // 2. 添加一个新的sel
        // 相当于子 cmd
        // 关于子command的处理方式
        /**
         * 由于 子command 不在 history中，所以在查找依赖的时候,找不到.
         * 方式1: 查找命令的时候同时查找 subCmd.
         * 方式2: 将子cmd的依赖,辅助到主cmd的依赖中. 需要防止重名
         * 这里使用 方式1
         */
        let curChain = mapScene.curChain;
        if(!this._addselCmd){
            let pos = cc.v2(mapScene.node.width - 50, mapScene.node.height - 50);
            this._addselCmd = new AddSelCommand(curChain,pos);
            this._addselCmd.id = this.id;
            this.subCmds.push(this._addselCmd); // 一定要加入,寻找依赖对象的时候会用到.
        }
        this._addselCmd.setObj('chain',curChain);
        this._addselCmd.execute();
    }

    undo(){

        let gameMap = G.gameMap;

        let newChain = this.getObj('newChain');

        // 删除 chain
        if(newChain){

             this._addselCmd.undo();

            // 后面的命令,可能依赖 this._newChain
            // 找出所有依赖 this._newChain 的 cmd 进行更新
            this._lstAffect = this.getDepenItems(newChain);
            gameMap.removeChain(newChain);
            this.cleanAffectLst(this._lstAffect);
        }else{
            // 没有添加chain,只是添加了一个sel
            let curChain = gameMap.curChain;
            curChain.clean();
        }
    }
}

module.exports = AddChainCommand;
